package algoritmo;

import interfaz.Interfaz;

import java.util.ArrayList;
import java.util.Random;

	

public class Tablero {

	boolean hayMisil;
	public Integer[][] tablero;//ALIEN:1    MISIL:2   Defensor:3
	public Defensor defensor;
	public Alien alien;
	public Misil misil;
	
	public Tablero(){
		hayMisil = false;
		tablero = new Integer[20][20];
	}
	
	public Tablero(Tablero t2) {
		this.hayMisil=t2.hayMisil;
		this.tablero=new Integer[20][20];
		this.defensor=new Defensor(t2.defensor.x, t2.defensor.y);
		this.alien=new Alien(t2.alien.x, t2.alien.y, t2.alien.dir);
		if(t2.misil!=null)
			this.misil=new Misil(t2.misil.x, t2.misil.y);
		
	}
	
	public void pinta(){
		if(hayMisil)
			System.out.println("Alien: "+alien.x+" "+alien.y+" Defensor: "+defensor.x+" "+defensor.y+" Misil: "+misil.x+" "+misil.y);
		else
			System.out.println("Alien: "+alien.x+" "+alien.y+" Defensor: "+defensor.x+" "+defensor.y);
	}

	public void generarPartida(){
		for(int i=0;i<20;i++){
			for(int j=0;j<20;j++){
				tablero[i][j]=0;
			}
		}
		hayMisil = false;
		Random r = new Random();
		
		//Defensor		
		defensor = new Defensor(r.nextInt(20), 19);
		
		//Alien
		alien = new Alien(r.nextInt(20), r.nextInt(6),r.nextInt(1));//Tiene que estar entre las 6 primeras filas. 0:Oeste     1:Este
		
		tablero[alien.x][alien.y]=1;
		tablero[defensor.x][defensor.y]=3;
		
	}
	
	public void generarPartidaConcreta(){
		for(int i=0;i<20;i++){
			for(int j=0;j<20;j++){
				tablero[i][j]=0;
			}
		}
		hayMisil = false;
		
		//Defensor		
		defensor = new Defensor(1, 19);
		
		//Alien
		alien = new Alien(2, 3, 1);//Tiene que estar entre las 6 primeras filas. 0:Oeste     1:Este
		
		tablero[alien.x][alien.y]=1;
		tablero[defensor.x][defensor.y]=3;
		
	}
	
	public int avanzarTiempo(ArrayList<Tablero> resultado){
		int distancia=0;
		// Avanzar Alien
		if(alien.dir==1){
			tablero[alien.x][alien.y]=0;
			if(alien.x<19)
				alien.x++;
			else{
				alien.dir=0;
				alien.y++;
			}
			tablero[alien.x][alien.y]=1;
				
		}else{
			tablero[alien.x][alien.y]=0;
			if(alien.x>0)
				alien.x--;
			else{
				alien.dir=1;
				alien.y++;
			}
			tablero[alien.x][alien.y]=1;
		}
		
		if(alien!=null)
//			System.out.println("Alien: "+alien.x+" "+alien.y+" ");
			
		// Avanzar misil
		if(hayMisil){
			if(misil.y>0){
				tablero[misil.x][misil.y]=0;
				misil.y--;
				tablero[misil.x][misil.y]=2;
//				System.out.println("Misil: "+misil.x+" "+misil.y+" ");
				
				if(misil.y == alien.y && misil.x != alien.x)
					distancia = Math.abs(misil.x - alien.x);
				
			}else{
				tablero[misil.x][misil.y]=0;
				hayMisil=false;
				misil = null;
			}
		}
		if(resultado!=null){//Si resultado no es null, estamos pintando por pantalla el Mejor cromosoma=> vamos guardando en un 
							//array como queda el tablero cada vez que se avanza el tiempo 
			Tablero t = new Tablero(this);
			resultado.add(t);
		}
		return distancia;
	}
	
	public boolean terminacion(boolean[] ganaUsuario){
		boolean termina=false;
		
		if(alien.y==19){
			ganaUsuario[0]=false;
			termina=true;
		}else{
			if(hayMisil && misil.x==alien.x && misil.y==alien.y){
				ganaUsuario[0]=true;
				termina=true;
			}
		}
		return termina;
	}
	
	public int evaluar(Nodo arbol, int[] distanciaTiempo, ArrayList<Tablero> resultado){
		int valor1, valor2, valor3;
		int nuevaDistancia = 0;
		valor1=valor2=valor3=0;
		
		if(arbol.esHoja()){
			if(arbol.dato=="fuego"){
				if(!hayMisil){
					hayMisil=true;
					misil = new Misil(defensor.x,defensor.y-1);
					tablero[misil.x][misil.y]=2;
				}
				distanciaTiempo[0] = distanciaTiempo[0] + avanzarTiempo( resultado);
//				termina=terminacion(false);
				distanciaTiempo[1]=distanciaTiempo[1]+1;
				valor1=1;
				
			}else if(arbol.dato=="izquierda"){
				tablero[defensor.x][defensor.y]=0;
				if(defensor.x>0)
					defensor.x--;
				if(defensor!=null)
//					System.out.println("Defensor: "+defensor.x+" "+defensor.y+" ");
				tablero[defensor.x][defensor.y]=3;
				distanciaTiempo[1]=distanciaTiempo[1]+1;
				distanciaTiempo[0] = distanciaTiempo[0] + avanzarTiempo( resultado);
//				termina=terminacion(false);
				valor1=1;
				
			}else if(arbol.dato=="derecha"){
				tablero[defensor.x][defensor.y]=0;
				if(defensor.x<19)
					defensor.x++;
//				distanciaTiempo[1]=distanciaTiempo[1]+1;
				if(defensor!=null)
//					System.out.println("Defensor: "+defensor.x+" "+defensor.y+" ");
				tablero[defensor.x][defensor.y]=3;
				distanciaTiempo[0] = distanciaTiempo[0] + avanzarTiempo( resultado);
				distanciaTiempo[1]=distanciaTiempo[1]+1;
//				termina=terminacion(false);
				valor1=1;
				
			}else if(arbol.dato=="distY"){
				valor1=alien.y;
				
			}else if(arbol.dato=="distX"){
				valor1 = Math.abs(alien.x - defensor.x);
				
				if(alien.dir==0 && (alien.x<=defensor.x) || alien.dir==1 && (alien.x>=defensor.x)){//Si se alejan
					valor1=-valor1;
				}
			}
			return valor1;
			
		}else{//Es operador
			if(arbol.dato=="IF"){//Si el valor es >=1 devuelve true;
				valor1=evaluar(arbol.izq,  distanciaTiempo, resultado);
				if(!terminacion(new boolean[1])){
					if(valor1 != 0){
						valor2 = evaluar(arbol.central,  distanciaTiempo, resultado);
					}else{
						valor2 = evaluar(arbol.der,  distanciaTiempo, resultado);
					}
						
				}
				return valor1+valor2;
				
			}else if(arbol.dato=="PROGN2"){
				valor1=evaluar(arbol.izq,  distanciaTiempo, resultado);
				if(!terminacion(new boolean[1])){
					valor2=evaluar(arbol.der,  distanciaTiempo, resultado);
				}
				return valor1+valor2;
				
			}else if(arbol.dato=="PROGN3"){
				valor1=evaluar(arbol.izq,  distanciaTiempo, resultado);
				if(!terminacion(new boolean[1])){
					valor2=evaluar(arbol.central,  distanciaTiempo, resultado);
					if(!terminacion(new boolean[1])){
						valor3=evaluar(arbol.der,  distanciaTiempo, resultado);
					}
				}
				return valor1+valor2+valor3;
				
			}else if(arbol.dato=="EQ"){
				valor1=evaluar(arbol.izq,  distanciaTiempo, resultado);
				if(!terminacion(new boolean[1])){
					valor2=evaluar(arbol.der,  distanciaTiempo, resultado);
				
					if(valor1==valor2)
						return 1;
					else 
						return 0;
				}
			}
			return 0;
		}
	}
	
	public void pintarPosiciones(){
		String fila="";
		if(hayMisil)
			fila +=("Misil: "+misil.x+" "+misil.y+" ");
		if(defensor!=null)
			fila +=("Defensor: "+defensor.x+" "+defensor.y+" ");
		if(alien!=null)
			fila +=("Alien: "+alien.x+" "+alien.y);
		
		System.out.println(fila);
	}

	public void pintarTablero() {
		String fila="";
		for(int i=0;i<20;i++){
			for(int j=0;j<20;j++){
				fila = fila + tablero[i][j];			
			}
			System.out.println(fila);
			fila="";
		}
		
	}
	
}
